// 该文件用于配置自定义axios
import axios from 'axios';
// 引入状态码转提示处理函数
import { handleNetworkError, handleBussinessError } from './handlerRequest';
// 引入element-ui提示信息
import { Message } from "element-ui";
// 引入vuex
import store from '@/store';

const http = axios.create({
    baseURL: process.env.VUE_APP_BASE_URL, // 源接口地址(依据环境模式决定)
    timeout: 10000, // 超时时间
    responseType: 'json',  // 响应类型
});

// 当token过期时，根据refresh_token重新获取token
async function refreshToken(refresh_token) {
    return await axios({
        method: 'post',
        baseURL: process.env.VUE_APP_BASE_URL,
        url: '/users/refresh',
        data: {
            refresh_token,
        },
    });
}

// 添加请求拦截器
http.interceptors.request.use(function (config) {
    // 为每个请求添加 token
    const userInfo = JSON.parse(localStorage.getItem('userInfo') || 'null');
    if (userInfo) config.headers.Authorization = 'Bearer ' + userInfo.token;
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
http.interceptors.response.use(async function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    // console.log(response);
    let code = response.data?.code;
    let msg = response.data?.msg;
    if (code === 500001) {
        // token无效或者token过期
        // 需要重新获取token
        const userInfo = JSON.parse(localStorage.getItem('userInfo') || 'null');
        // 未登录，提示信息并跳转到登录页
        if (!userInfo) {
            Message.error('请重新登录');
            return response.data;
        };
        // 获取refresh_token
        const refresh_token = userInfo.refresh_token;

        // 请求新的token
        let { data } = await refreshToken(refresh_token);
        // if (!data) return response.data;
        const newToken = data.data;
        // 将新的token替换到userInfo中
        userInfo.token = newToken;
        // 将新的userInfo保存到vuex中
        store.commit('setUserInfo', userInfo);

        // 重新请求数据
        // console.log(response.config);
        let [res, err] = await request(response.config);
        if (res) return res;
        if (err) return err;
    }
    // 处理状态码
    handleBussinessError(code, msg);
    // 将响应数据中的data对象返回出去
    return response.data;
}, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // console.log(error.response?.status);
    handleNetworkError(error.response?.status);
    return Promise.reject(error);
});

// 请求成功后(statue为200)，进一步处理，根据响应状态码返回不同的数据
const request = option => {
    return new Promise(async resolve => {
        let res = await http(option);
        // console.log(res.data);
        if (res?.code === 200) resolve([res, null]);
        else resolve([null, res]);
    });
};

export default request;